package com.tps.cloud.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.annotations.VisibleForTesting;
import com.tps.cloud.exception.BusinessException;
import com.tps.cloud.system.dto.SystemDictItemDto;
import com.tps.cloud.system.entity.SystemDict;
import com.tps.cloud.system.entity.SystemDictItem;
import com.tps.cloud.system.mapper.SystemDictItemMapper;
import com.tps.cloud.system.param.SystemDictItemParam;
import com.tps.cloud.system.service.SystemDictItemService;
import com.tps.cloud.system.vo.SystemDictItemVo;
import com.tps.cloud.system.vo.SystemDictVo;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 字典项数据表(SystemDictItem)表服务实现类
 *
 * @author makejava
 * @since 2024-08-30 16:23:12
 */
@Service
@AllArgsConstructor
public class SystemDictItemServiceImpl extends ServiceImpl<SystemDictItemMapper, SystemDictItem>  implements SystemDictItemService {

    private final MessageSourceAccessor messages;

    @Override
    public IPage selectDictItemPage(Page page, SystemDictItemParam param) {
        return page(page,
                Wrappers.<SystemDictItem>lambdaQuery()
                        .eq(StrUtil.isNotBlank(param.getDictId()), SystemDictItem::getDictId, param.getDictId())
                        .like(StrUtil.isNotBlank(param.getLabel()), SystemDictItem::getLabel, param.getLabel()));
    }

    @Override
    public Long createDictItem(SystemDictItemDto systemDictItemDto) {
        //验证字典类型唯一性
        validateItemLabelUnique(systemDictItemDto);
        SystemDictItem systemDictItem=new SystemDictItem();
        BeanUtils.copyProperties(systemDictItemDto, systemDictItem);
        this.save(systemDictItem);
        return systemDictItem.getId();
    }


    @Override
    public void updateDictItem(SystemDictItemDto systemDictItemDto) {
        //验证id是否存在
        validateDictItemExists(systemDictItemDto.getId());
        //验证字典类型唯一性
        validateItemLabelUnique(systemDictItemDto);
        SystemDictItem systemDictItem=new SystemDictItem();
        BeanUtils.copyProperties(systemDictItemDto, systemDictItem);
        this.updateById(systemDictItem);
    }

    @Override
    public void deleteDictItemByIds(List<Long> ids) {
        //批量删除字典项
        baseMapper.deleteByIds(ids);
    }

    @Override
    public SystemDictItemVo getDictItem(Long id) {
        SystemDictItem systemDictItem=baseMapper.selectById(id);
        return BeanUtil.toBean(systemDictItem, SystemDictItemVo.class);
    }

    /**
     * 验证类型唯一性
     * @param id
     */
    @VisibleForTesting
    void validateDictItemExists(Long id) {
        if (id == null) {
            throw new BusinessException(messages.getMessage("System.Id.IsNull"));
        }
        SystemDictItem systemDictItem = baseMapper.selectById(id);
        if (systemDictItem == null) {
            throw new BusinessException(messages.getMessage("SystemDictItemDto.Id.NotExist"));
        }
    }

    /**
     * 验证字典项是否唯一
     * @param systemDictItemDto
     */
    private void validateItemLabelUnique(SystemDictItemDto systemDictItemDto){
        SystemDictItem systemDictItem = baseMapper.selectOne(SystemDictItem::getLabel, systemDictItemDto.getLabel(),SystemDictItem::getDictId, systemDictItemDto.getDictId());
        if (systemDictItem == null
                || ObjUtil.equal(systemDictItemDto.getId(), systemDictItem.getId())) {
            return;
        }
        throw new BusinessException(messages.getMessage("SystemDictItemDto.Label.Exist"));
    }
}
